﻿using System; 
using System.IO; 
using System.Text; 
using System.Security.Cryptography;

namespace CtrlEncryptor
{
    public class DESEncryptor 
    { 
        #region 私有成员 
        /// 输入字符串 
        private string inputString; 

        /// 输出字符串 
        private string outString; 

        /// 输入文件路径 
        private string inputFilePath; 

        /// 输出文件路径 
        private string outFilePath; 

        /// 加密密钥 
        private string encryptKey = "87712800";
         
        /// 解密密钥 
        private string decryptKey = "87712800"; 

        /// 提示信息 
        private string noteMessage; 
        #endregion 

        #region 公共属性 
        /// 输入字符串 
        public string InputString 
        { 
            get{return inputString;} 
            set{inputString=value;} 
        } 

        /// 输出字符串 
        public string OutString 
        { 
            get{return outString;} 
            set{outString=value;} 
        } 

        /// 输入文件路径 
        public string InputFilePath 
        { 
            get{return inputFilePath;} 
            set{inputFilePath=value;} 
        } 

        /// 输出文件路径 
        public string OutFilePath 
        { 
            get{return outFilePath;} 
            set{outFilePath=value;} 
        } 

        /// 加密密钥 
        public string EncryptKey 
        { 
            get{return encryptKey;} 
            set{encryptKey=value;} 
        } 
 
        /// 解密密钥 
        public string DecryptKey 
        { 
            get{return decryptKey;} 
            set{decryptKey=value;} 
        } 

        /// 错误信息 
        public string NoteMessage 
        { 
            get{return noteMessage;} 
            set{noteMessage=value;} 
        } 
        #endregion 

        #region 构造函数 
        public DESEncryptor() 
        { 
        // 
        // TODO: 在此处添加构造函数逻辑 
        // 
        } 
        #endregion
 
        #region DES加密字符串 
        /// 加密字符串 
        /// 注意:密钥必须为８位 
        /// <param name="strText">字符串</param> 
        /// <param name="encryptKey">密钥</param> 

        public void DesEncrypt() 
        { 
            byte[] byKey=null; 
            byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; 
            try 
            { 
                byKey = System.Text.Encoding.UTF8.GetBytes(this.encryptKey.Substring(0,8)); 
                DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
                byte[] inputByteArray = Encoding.UTF8.GetBytes(this.inputString); 
                MemoryStream ms = new MemoryStream(); 
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write) ; 
                cs.Write(inputByteArray, 0, inputByteArray.Length); 
                cs.FlushFinalBlock(); 
                this.outString=Convert.ToBase64String(ms.ToArray()); 
            } 
            catch(System.Exception error) 
            { 
                this.noteMessage=error.Message; 
            } 
        } 
        #endregion
 
        #region DES解密字符串 
        /// 解密字符串 
        /// <param name="this.inputString">加了密的字符串</param> 
        /// <param name="decryptKey">密钥</param>  
        public void DesDecrypt() 
        { 
            byte[] byKey = null; 
            byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; 
            byte[] inputByteArray = new Byte[this.inputString.Length]; 
            try 
            { 
                byKey = System.Text.Encoding.UTF8.GetBytes(decryptKey.Substring(0,8)); 
                DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
                inputByteArray = Convert.FromBase64String(this.inputString); 
                MemoryStream ms = new MemoryStream(); 
                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write); 
                cs.Write(inputByteArray, 0, inputByteArray.Length); 
                cs.FlushFinalBlock(); 
                System.Text.Encoding encoding = new System.Text.UTF8Encoding(); 
                this.outString=encoding.GetString(ms.ToArray()); 
            } 
            catch(System.Exception error) 
            { 
                this.noteMessage=error.Message; 
            } 
        } 
        #endregion
 
        #region DES加密文件 
        /// DES加密文件 
        /// <param name="this.inputFilePath">源文件路径</param> 
        /// <param name="this.outFilePath">输出文件路径</param> 
        /// <param name="encryptKey">密钥</param> 
        public void FileDesEncrypt() 
        { 
            byte[] byKey=null; 
            byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; 
            try 
            { 
                byKey = System.Text.Encoding.UTF8.GetBytes(this.encryptKey.Substring(0,8)); 
                FileStream fin = new FileStream(this.inputFilePath, FileMode.Open, FileAccess.Read); 
                FileStream fout = new FileStream(this.outFilePath, FileMode.OpenOrCreate, FileAccess.Write); 
                fout.SetLength(0); 
                //Create variables to help with read and write. 
                byte[] bin = new byte[100]; //This is intermediate storage for the encryption. 
                long rdlen = 0; //This is the total number of bytes written. 
                long totlen = fin.Length; //This is the total length of the input file. 
                int len; //This is the number of bytes to be written at a time. 
                DES des = new DESCryptoServiceProvider(); 
                CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write); 

                //Read from the input file, then encrypt and write to the output file. 
                while(rdlen < totlen) 
                { 
                    len = fin.Read(bin, 0, 100); 
                    encStream.Write(bin, 0, len); 
                    rdlen = rdlen + len; 
                } 

                encStream.Close(); 
                fout.Close(); 
                fin.Close(); 
            } 
            catch(System.Exception error) 
            { 
                this.noteMessage=error.Message.ToString(); 
            } 
        } 
        #endregion 
        
        #region DES解密文件 
        /// 解密文件 
        /// <param name="this.inputFilePath">加密了的文件路径</param> 
        /// <param name="this.outFilePath">输出文件路径</param> 
        /// <param name="decryptKey">密钥</param> 
        public void FileDesDecrypt() 
        { 
            byte[] byKey = null; 
            byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; 
            try 
            { 
                byKey = System.Text.Encoding.UTF8.GetBytes(decryptKey.Substring(0,8)); 
                FileStream fin = new FileStream(this.inputFilePath, FileMode.Open, FileAccess.Read); 
                FileStream fout = new FileStream(this.outFilePath, FileMode.OpenOrCreate, FileAccess.Write); 
                fout.SetLength(0); 
                //Create variables to help with read and write. 
                byte[] bin = new byte[100]; //This is intermediate storage for the encryption. 
                long rdlen = 0; //This is the total number of bytes written.  
                long totlen = fin.Length; //This is the total length of the input file. 
                int len; //This is the number of bytes to be written at a time. 
                DES des = new DESCryptoServiceProvider(); 
                CryptoStream encStream = new CryptoStream(fout, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);  

                //Read from the input file, then encrypt and write to the output file. 
                while(rdlen < totlen) 
                { 
                    len = fin.Read(bin, 0, 100); 
                    encStream.Write(bin, 0, len); 
                    rdlen = rdlen + len; 
                } 

                encStream.Close(); 
                fout.Close(); 
                fin.Close(); 
            } 
            catch(System.Exception error) 
            { 
                this.noteMessage=error.Message.ToString(); 
            } 
        } 
        #endregion

        #region MD5
        /// MD5 Encrypt 
        /// <param name="strText">text</param> 
        /// <returns>md5 Encrypt string</returns> 
        public void MD5Encrypt()
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            this.outString = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(this.InputString)));
            this.outString = this.outString.Replace("-", "");
        }
        #endregion 


    } 
}